package com.team2.hospital.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * JedisConfig类用于配置Redis的连接池。
 * 通过@PropertySource注解引入外部的配置文件，使用@Value注解加载配置属性。
 * 配置了Jedis连接池的参数，并创建了JedisPool和JedisPoolConfig Bean。
 */
@Configuration
@PropertySource(value = "classpath:redisConfig.properties") // 从classpath中加载redis配置文件
public class JedisConfig {

    // 从配置文件中加载Redis相关的属性
    @Value(value = "${redis.host}")
    private String host;

    @Value(value = "${redis.port}")
    private int port;

//    @Value(value = "${redis.password}")
//    private String password;

    @Value(value = "${redis.database}")
    private int database;

    @Value(value = "${redis.maxTotal}0")
    private int maxTotal;

    @Value(value = "${redis.maxIdle}0")
    private int maxIdle;

    @Value(value = "${redis.minIdle}0")
    private int minIdle;

    @Value(value = "${redis.maxWaitMillis}")
    private int maxWaitMillis;

    @Value(value = "${redis.timeout}")
    private int timeout;

    @Value(value = "${redis.testOnBorrow}")
    private boolean testOnBorrow;

    /**
     * 创建JedisPoolConfig配置对象，设置连接池的基本属性。
     *
     * @return JedisPoolConfig对象，配置Redis连接池的参数
     */
    @Bean(name = "jedisPoolConfig")
    public JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

        // 设置最大连接数
        jedisPoolConfig.setMaxTotal(maxTotal);

        // 设置最大空闲连接数
        jedisPoolConfig.setMaxIdle(maxIdle);

        // 设置最小空闲连接数
        jedisPoolConfig.setMinIdle(minIdle);

        // 设置最大等待时间
        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);

        // 设置从连接池获取连接时是否验证连接
        jedisPoolConfig.setTestOnBorrow(testOnBorrow);

        return jedisPoolConfig;
    }

    /**
     * 创建JedisPool对象，配置连接池与Redis的连接信息。
     *
     * @param jedisPoolConfig 配置JedisPool的参数
     * @return JedisPool对象，用于从连接池中获取Redis连接
     */
    @Bean(name = "jedisPool")
    public JedisPool jedisPool(@Qualifier(value = "jedisPoolConfig") JedisPoolConfig jedisPoolConfig) {
        // 创建JedisPool对象并返回
        return new JedisPool(jedisPoolConfig, host, port, timeout, null, database);
    }
}
